#include <stdio.h>

#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavcodec/codec_id.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
#include "rtp.h"
#include "wasm_utils.h"

//PTS：Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来,这帧图像什么时候显示给用户
//DTS：Decode Time Stamp表示这个压缩包应该什么时候被解码。

//回调函数  js使用
typedef void (*VideoCallback)(unsigned char *buff, int size, int frameWidth, int pix_h, int pts, int dts);
typedef void (*AudioCallback)(unsigned char *buff, int size, int pts, int dts);

//输出的图片格式
#define OUT_IMG_YUV 0
#define OUT_IMG_RGB 1
//--------------------------------------
//多媒体视频帧

typedef struct VideoFrame
{

    //视频缓存
    uint8_t *yuvBuf;
    int yuvBufferSize;
    uint8_t *rgbBuffer;
    //m_rgbBuffer 的buf大小
    int rgbBufferSize;
    //yuv
    AVFrame *yuvFrame;

    //PTS：Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
    //DTS：Decode Time Stamp。DTS主要是标识读入内存中的ｂｉｔ流在什么时候开始送入解码器中进行解码。
    int pts;
    int dts;
} VideoFrame;

//帧类型
enum FrameType
{
    FT_VIDEO,
    FT_AUDIO
};
typedef struct AudioFrame
{
    //音频缓存 预留
    unsigned char *pcmBuffer;
    int pts;
    int dts;
    AVFrame *pcmFrame;
    int pcmBufferSize;
} AudioFrame;

typedef struct VideoDecoder
{
    //回调输出的格式，0=yuv 1=rgb
    int outImgFrameType;

    //--------------------------------
    AVPacket *packet;
    //当前帧的rtp头内容
    DinaRtpHead currFrameRtpHead;

    //当前视频帧
    //分配一次 每次解码成功修改其中的内容
    VideoFrame videoFrame;
    AudioFrame audioFrame;

    //struct SwsContext *m_img_convert_ctx;
    enum AVCodecID videoCodecId;
    const AVCodec *videoCodec;
    AVCodecContext *videoCodecContext;

    enum AVCodecID audioCodecId;

    AVCodecContext *audioCodecContext;
    const AVCodec *audioCodec;

    AVCodecParserContext *parser;
    int frameWidth;
    int frameHeight;
    //--------------------------------
    VideoCallback videoCallback;
    AudioCallback audioCallback;
    //--------------------------------

} VideoDecoder;

//-------------------------------
//函数声明
//wasm用，初始化h264解码器
//返回一个 VideoDecoder*
int initH264Decoder(int videoCallbackPtr, int audioCallbackPtr, int outImgFrameType);
//wasm用，初始化h265解码器
//outImgFrameType  输出时候的数据类型0=yuv  1=rgb
int initH265Decoder(int videoCallbackPtr, int audioCallbackPtr, int outImgFrameType);
//释放initH264Decoder、initH265Decoder生成的解码器
void closeDecoder(int decoderImpl);

//输入待解码的裸流视频帧数据
//decoderImpl 解码器实例指针
//pData 一帧数据
void addRawVideoFrameData(int decoderImpl, unsigned char *pData, int size, int pts, int dts);
//输入待解码的rtp帧数据
void addRtpFrameData(int decoderImpl, unsigned char *pData, int size);

//-------------------------------
